﻿using System.Text.Json.Serialization.Metadata;

namespace Sage.Encryption
{
    /// <summary>
    /// 定义安全数据存储操作的接口
    /// </summary>
    public interface IWindowsSecureDataStorage
    {
        /// <summary>
        /// 安全地存储数据对象
        /// </summary>
        /// <typeparam name="T">要存储的数据类型</typeparam>
        /// <param name="key">用于标识数据的唯一键</param>
        /// <param name="data">要存储的数据对象</param>
        /// <param name="jsonTypeInfo">源生成的JsonTypeInfo，用于序列化</param>
        void SaveData<T>(string key, T data, JsonTypeInfo<T> jsonTypeInfo) where T : class;

        /// <summary>
        /// 检索并解密存储的数据
        /// </summary>
        /// <typeparam name="T">存储的数据类型</typeparam>
        /// <param name="key">数据的唯一标识键</param>
        /// <param name="jsonTypeInfo">源生成的JsonTypeInfo，用于反序列化</param>
        /// <returns>解密并反序列化后的数据对象</returns>
        T GetData<T>(string key, JsonTypeInfo<T> jsonTypeInfo) where T : class;

        /// <summary>
        /// 尝试获取数据，如果数据不存在不抛出异常返回false
        /// </summary>
        /// <typeparam name="T">存储的数据类型</typeparam>
        /// <param name="key">数据的唯一标识键</param>
        /// <param name="jsonTypeInfo">源生成的JsonTypeInfo，用于反序列化</param>
        /// <param name="data">输出参数，成功时包含反序列化的数据</param>
        /// <returns>如果成功获取数据返回true，否则返回false(包括数据为null的时候)</returns>
        bool TryGetData<T>(string key, JsonTypeInfo<T> jsonTypeInfo, out T? data) where T : class;

        /// <summary>
        /// 检查指定键的数据是否存在
        /// </summary>
        /// <param name="key">要检查的键</param>
        /// <returns>如果数据存在返回true，否则返回false</returns>
        bool DataExists(string key);

        /// <summary>
        /// 删除指定键的数据
        /// </summary>
        /// <param name="key">要删除的数据键</param>
        /// <returns>如果数据被成功删除返回true，如果数据不存在返回false</returns>
        bool DeleteData(string key);

        /// <summary>
        /// 更新现有数据，如果数据不存在则创建新数据
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="key">数据键</param>
        /// <param name="updateFunc">更新函数，接收现有数据并返回更新后的数据</param>
        /// <param name="defaultValue">如果数据不存在，用于创建的默认值</param>
        /// <param name="jsonTypeInfo">源生成的JsonTypeInfo，用于序列化和反序列化</param>
        void UpdateData<T>(string key, Func<T, T> updateFunc, T defaultValue, JsonTypeInfo<T> jsonTypeInfo) where T : class;
    }

}
